package com.examination.client.util;

import io.netty.util.internal.StringUtil;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {


    public static final String DATE_FORMAT_YYYY_MM_DD            =  "yyyy-MM-dd";
    public static final String DATE_FORMAT_YYYY_MM_DD_HH_MM_SS   =  "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMAT_YYYYMMDD              =  "yyyyMMdd";
    public static final String DATE_FORMAT_YYYYMMDDHHMMSS        =  "yyyyMMddHHmmss";
    public static final String DATE_FORMAT_HH_MM                 =  "HH:mm";
    public static final String DATE_FORMAT_YYYY_MM                =  "yyyy-MM";



    /**
     * 根据开始与结束日期获取相减得到的天数
     * @param beginDateStr
     * @param endDateStr
     * @return
     */
    public static long getDaySub(String beginDateStr,String endDateStr) throws ParseException {
            SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_YYYY_MM_DD);
            Date beginDate;
            Date endDate;
            beginDate = format.parse(beginDateStr);
            endDate= format.parse(endDateStr);
            return (endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
    }

    /**
     * 根据开始与结束日期获取相减得到的天数
     * @param beginDateStr
     * @param endDateStr
     * @return
     */
    public static long getDaySub(String beginDateStr,String endDateStr, SimpleDateFormat format) {
        try {
            Date beginDate;
            Date endDate;
            beginDate = format.parse(beginDateStr);
            endDate = format.parse(endDateStr);
            return (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
        }catch (Exception e){
            return 0L;
        }
    }

    /**
     * 日期 Date 转 String
     * @param date
     * @param type
     * @return
     */
    public static String DateToString(Date date, String type){
        SimpleDateFormat dateFormat = new SimpleDateFormat(type);
        return dateFormat.format(date);
    }

    /**
     * 时间 String 转 Date
     * @param dateString
     * @param type
     * @return
     */
    public static Date StringToDate(String dateString, String type){
        SimpleDateFormat sdf = new SimpleDateFormat(type);
        Date date = null;
        try {
            date = sdf.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 时间 String 转 Calendar
     * @param dateString
     * @param type
     * @return
     */
    public static Calendar StringtoCalendar(String dateString, String type){
        SimpleDateFormat sdf= new SimpleDateFormat(type);
        Date date = null;
        try {
            date = sdf.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }
    /**
     * 在指定日期上加一天
     * @param date
     * @return
     */
    public static Date addDateOneDay(Date date) {
        if (null == date) {
            return date;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);   //设置当前日期
        c.add(Calendar.DATE, 1); //日期加1天
        date = c.getTime();
        return date;
    }
    /**
     * // 获取当前日期的前后日期 i为正数 向后推迟i天，负数时向前提前i天
     * @param i
     * @return
     */
    public static Date getNumdate(int i) {
        Calendar cd = Calendar.getInstance();
        cd.add(Calendar.DATE, i);
        return cd.getTime();
    }
    /**
     * 获取某月的第一天
     *  0当月
     *  -1 前一个月
     *  1 后一个月
     * @param i
     * @return
     */
    public static Date getNumMonth(int i){
        Calendar   cal_1=Calendar.getInstance();//获取当前日期
        cal_1.add(Calendar.MONTH, i);
        cal_1.set(Calendar.DAY_OF_MONTH,1);
        return cal_1.getTime();
    }
    /**
     * 获取本周日的日期
     * @return
     */
    public static Date getSundayOfThisWeek() {
        Calendar c = Calendar.getInstance();
        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (day_of_week == 0) {
            day_of_week = 7;
        }
        c.add(Calendar.DATE, -day_of_week + 7);
        return c.getTime();
    }
    /**
     * 获取本周一的日期
     * @return
     */
    public static Date getMondayOfThisWeek() {
        Calendar c = Calendar.getInstance();
        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (day_of_week == 0) {
            day_of_week = 7;
        }
        c.add(Calendar.DATE, -day_of_week + 1);
        return c.getTime();
    }

    /**
     * 以传入日期为准，获取某天日期
     * @param days eg：+1 获取明天日期， -1获取前一天日期
     * @param format 日期格式
     * @return String 类型日期
     */
    public static String assignDate(int days, String format, String date) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new SimpleDateFormat(format).parse(date));
        calendar.add(Calendar.DATE, days);
        return DateFormatUtils.format(calendar.getTime(), format);
    }

    /**
     * 以传入日期、传入格式为准，获取某天日期
     * @param days eg：+1 获取明天日期， -1获取前一天日期
     * @param format 日期格式
     * @return String 类型日期
     */
    public static String assignDate(int days, String oriformat, String format, String date) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new SimpleDateFormat(oriformat).parse(date));
        calendar.add(Calendar.DATE, days);
        return DateFormatUtils.format(calendar.getTime(), format);
    }

    /**
     * 以传入日期、传入格式为准，获取某天日期
     * @param format 日期格式
     * @return String 类型日期
     */
    public static String assignDate(String oriformat, String format, String date) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new SimpleDateFormat(oriformat).parse(date));
        return DateFormatUtils.format(calendar.getTime(), format);
    }

    /**
     * 以当天日期为准，获取某天日期
     * @param days eg：+1 获取明天日期， -1获取前一天日期
     * @param format 日期格式
     * @return String 类型日期
     */
    public static String assignDate(int days, String format){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, days);
        return DateFormatUtils.format(calendar.getTime(), format);
    }

    /**
     * 以当前时间为基础添加毫秒
     * @param time    时间（毫秒）
     * @param format  输出日期格式
     * @return String 类型日期
     */
    public static String addTime(long time, String format){
        Date date = new Date(System.currentTimeMillis() + time);
        return DateFormatUtils.format(date.getTime(), format);
    }

    /**
     * 获取当前10位时间戳
     * @return 时间戳
     */
    public static Long get10Timespan(){
        return System.currentTimeMillis()/1000;
    }

    /**
     * 获取当前10位时间戳字符串格式
     * @return 时间戳
     */
    public static String get10TimespanStr(){
        return String.valueOf(get10Timespan());
    }


    /**
     *
     * @param date String格式日期
     * @param format 日期格式
     * @return
     */
    public static Long stringDate2Timespan(String date, String format){
        try {
            return new SimpleDateFormat(format).parse(date).getTime();
        } catch (ParseException e) {
           return null;
        }
    }


    /**
     *
     * @param time    时间（毫秒）
     * @param format  输出日期格式
     * @return String 类型日期
     */
    public static String timespan2StringDate(long time, String format){
        Date date = new Date(time);
        return DateFormatUtils.format(date.getTime(), format);
    }

    /**
     * ****年**月**日 **：**：**
     * @param time    时间（秒）
     * @return String 类型日期
     */
    public static String timespan2StringDate(Long time){
        return DateFormatUtils.format(time * 1000, DateUtil.DATE_FORMAT_YYYY_MM_DD_HH_MM_SS);
    }


    /**
     * 日期转成周几
     * @param datetime
     * @return
     */
    public static String dateToWeek(String datetime) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        String[] weekDays = { "周日", "周一", "周二", "周三", "周四", "周五", "周六"};
        Calendar cal = Calendar.getInstance(); // 获得一个日历
        Date datet = null;
        try {
            datet = f.parse(datetime);
            cal.setTime(datet);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
        if (w < 0) {
            w = 0;
        }
        return weekDays[w];
    }

    /**
     * 获得今天凌晨时间戳-到秒
     */
    public static long getLingChenTime(){
        try{
            //当天日期
            Date date = new Date();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String today = simpleDateFormat.format(date.getTime());
            //System.out.println("当天日期" + today);

            //1、当天凌晨(毫秒)
            long daytime = simpleDateFormat.parse(today).getTime();
            return daytime/1000;
        }catch (Exception e){

        }
        return 0L;
    }

    /**
     *  获取以分为单位的失效时间
     * @param minute 分钟
     * @return long 类型的失效时间
     */
    public static Long getExpireTimeByMinute(int minute){
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE, minute);
        return nowTime.getTime().getTime();
    }

    /**
     *  把日期和时分秒组合起来转成时间戳
     * @param day 日期
     * @param hour 时分秒
     * @return 这个时间戳的秒值
     */
    public static Long dayJiaHourToTime(String day,String hour){
        String str = "";
        if(StringUtil.isNullOrEmpty(day)){
            return null;
        }

        if(StringUtil.isNullOrEmpty(hour)){
            str = day + " 00:00:00";
        }else{
            str = day+" "+hour;
        }

        return StringToDate(str,DATE_FORMAT_YYYY_MM_DD_HH_MM_SS).getTime()/1000;
    }
}
